package cn.buddha.jec.util;

import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Bean工具类
 */
public class TongBeanUtils extends BeanUtils {

    /**
     * 判断是否为空
     */
    public static boolean isNullObj(Object obj) {
        if (null == obj) {
            return true;
        }

        if (obj instanceof String) {
            return StringUtils.isEmpty(obj);
        }

        if (obj instanceof List) {
            return ((List) obj).isEmpty();
        }

        if (obj instanceof Set) {
            return ((Set) obj).isEmpty();
        }

        if (obj instanceof Map) {
            return ((Map) obj).isEmpty();
        }

        return false;
    }

    /**
     * @return T
     * @Author 友野浩二
     * @Description // 对象为空（包括list size=0, string length=0），返回target
     * @Param [source, target]
     **/
    public static <T> T nvl(T source, T target) {
        return isNullObj(source) ? target : source;
    }

    /**
     * @return java.lang.String[]
     * @Author 友野浩二
     * @Description // 获取对象属性名称
     * @Param [obj]
     **/
    public static String[] getFieldName(Object obj) {
        Field[] fields = obj.getClass().getDeclaredFields();
        String[] fieldNames = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
            fieldNames[i] = fields[i].getName();
        }
        return fieldNames;
    }

    /*
     * @Author 友野浩二
     * @Description // 对象转Map
     * @Param [obj]
     * @return java.util.Map
     **/
    public static Map object2Map(Object obj) {
        return JSON.parseObject(JSON.toJSONString(obj), Map.class);
    }

    /**
     * @return java.lang.Object
     * @Author 友野浩二
     * @Description // Map转对象
     * @Date 2020/4/14 22:35
     * @Param [map]
     */
    public static Object map2Object(Map map) {
        return JSONObject.parseObject(JSONUtils.toJSONString(map), Object.class);
    }

}
